// 之字形输出，即分别输出每条右上左下的对角线，每次的输出顺序相反，
//        从上到下的时候即从右上角输出到左下角，从下到上的时候即从左下角输出到右上角
// https://blog.csdn.net/coffee_dount/article/details/105793750
var a = [
    [11, 42, 23, 41],
    [57, 61, 45, 52],
    [71, 11, 23, 42],
];

function ZMatrix(arr) {
    //? 初始化右上角起点rtRow、rtCol；左下角起点lbRow、lbCol
    let rtRow = 0
    let rtCol = 0
    let lbRow = 0
    let lbCol = 0
    let rowLen = arr.length
    let colLen = arr[0].length
    let fromTop = true; //? 初始方向为从上到下
    while (rtRow < rowLen) {

        printLine(arr,rtRow,rtCol,lbRow,lbCol,fromTop)
        //? 更新右上角起点行
        rtCol === colLen - 1 ? rtRow++ : rtRow;
        //? 更新右上角起点列
        rtCol === colLen - 1 ? rtCol : rtCol++;
        //? 更新左下角起点列
        lbRow === rowLen - 1 ? lbCol++ : lbCol;
        //? 更新左下角起点行
        lbRow === rowLen - 1 ? lbRow : lbRow++;
    }
}
function printLine(matrix,rtRow,rtCol,lbRow,lbCol,fromTop) {
    //? 方向从上到下
    if (fromTop) {
        let r = rtRow,
            c = rtCol;
        while (r <= lbRow && c >= lbCol) {
            //? 从右上到左下
            console.log(matrix[r++][c--]);
        }
    }
    //? 方向从下到上
    else {
        let r = lbRow,
            c = lbCol;
        while (r >= rtRow && c <= rtCol) {
            //? 从右上到左下
            console.log(matrix[r--][c++]);
        }
    }
}

ZMatrix(a)
